package com.ruoyi.service;

import com.amazonaws.services.s3.model.UploadPartResult;
import com.ruoyi.domain.FileUploadTask;
import com.ruoyi.dto.DocumentFile;
import com.ruoyi.dto.InitTaskParam;
import com.ruoyi.dto.TaskInfoDTO;
import com.ruoyi.platform.service.BaseManager;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 分片上传-分片任务记录Service接口
 *
 * @author ruoyi
 * @date 2023-02-03
 */
public interface IFileUploadTaskService extends BaseManager<FileUploadTask> {
    /**
     * 查询分片上传-分片任务记录
     *
     * @param id 分片上传-分片任务记录主键
     * @return 分片上传-分片任务记录
     */
    FileUploadTask selectFileUploadTaskById(Long id);

    /**
     * 查询分片上传-分片任务记录列表
     *
     * @param fileUploadTask 分片上传-分片任务记录
     * @return 分片上传-分片任务记录集合
     */
    public List<FileUploadTask> selectFileUploadTaskList(FileUploadTask fileUploadTask);

    /**
     * 新增分片上传-分片任务记录
     *
     * @param fileUploadTask 分片上传-分片任务记录
     * @return 结果
     */
    public int insertFileUploadTask(FileUploadTask fileUploadTask);

    /**
     * 修改分片上传-分片任务记录
     *
     * @param fileUploadTask 分片上传-分片任务记录
     * @return 结果
     */
    public int updateFileUploadTask(FileUploadTask fileUploadTask);

    /**
     * 批量删除分片上传-分片任务记录
     *
     * @param ids 需要删除的分片上传-分片任务记录主键集合
     * @return 结果
     */
    public int deleteFileUploadTaskByIds(Long[] ids);

    /**
     * 删除分片上传-分片任务记录信息
     *
     * @param id 分片上传-分片任务记录主键
     * @return 结果
     */
    int deleteFileUploadTaskById(Long id);

    /**
     * 获取上传进度
     * @param identifier
     * @return
     */
    TaskInfoDTO getTaskInfo (String identifier);

    /**
     * 创建一个上传任务
     * @param param
     * @return
     */
    TaskInfoDTO initTask(InitTaskParam param);

    FileUploadTask getByIdentifier(String identifier);

    /**
     * 生成预签名上传url
     * @param bucket 桶名
     * @param objectKey 对象的key
     * @param params 额外的参数
     * @return
     */
    String genPreSignUploadUrl (String bucket, String objectKey, Map<String, String> params);

    /**
     * 合并分片
     * @param identifier
     */
    DocumentFile merge(String identifier);

    /**
     * 上传每个分片
     * @param bucketName
     * @param objectKey
     * @param uploadId
     * @param partNumber
     * @param inputStream
     * @param isEnd
     * @param partSize
     * @return
     */
    UploadPartResult partUpload(String bucketName, String objectKey, String uploadId, Integer partNumber, InputStream inputStream, Boolean isEnd, Long partSize);

}
